// 导入express
const express = require('express')
// 导入cors
const cors = require('cors')
const router = require('./view/router')
const multer = require('multer');
const path = require('path');
const upload = multer({ dest: 'public/uploads/' }); // 指定上传文件保存的目录
const db = require('./libs/db.config')

// 解决req.body值为空
var bodyParser = require('body-parser')

// 创建express的服务器实例
const app = express()


// 全局响应数据的中间件
app.use(function (req, res, next) {
    // status = 200 为成功； status = 500 为失败； 默认将 status 的值设置为 500，方便处理失败的情况

    res.returnMsg = function (data, err, status = 500) {
        res.send({
            // 状态
            status,
            // 状态描述，判断 err 是 错误对象 还是 字符串
            message: err instanceof Error ? err.message : err,
            // 返回的数据，需要判断
            page: data != null ? data : null,
        })
    }
    next()
})


// 中间件用于验证 Token
const checkTokenMiddleware = (req, res, next) => {
    const token = req.headers.authorization; // 获取请求头中的 Token

    jwt.verify(token, secretKey, (err, decoded) => {
        if (err) {
            return res.status(401).json({ message: 'Invalid Token' });
        }

        // 将解码后的 Token 负载信息存储在请求对象中，便于后续处理
        req.user = decoded;
        next();
    });
};

// 校验并解码 Token
function validateTokenExpiration(req, res, next) {
    const token = req.headers['authorization'];

    if (!token) {
        return res.sendStatus(401); // 如果没有提供 Token，则返回 401 错误
    }

    const secret = 'your_secret_key'; // 替换为你的私钥

    jwt.verify(token, secret, (err, decodedToken) => {
        if (err) {
            return res.sendStatus(403); // Token 不有效，返回 403 错误
        }

        // 检查 Token 的过期时间
        const currentTimestamp = Date.now() / 1000; // 当前时间戳，单位为秒
        if (decodedToken.exp < currentTimestamp) {
            return res.sendStatus(401); // Token 已过期，返回 401 错误
        }

        // Token 有效，继续处理下一个中间件或路由处理程序
        next();
    });
}

// 校验逻辑
function checkToken(req) {
    const authorizationHeader = req.headers.authorization;
    if (authorizationHeader) {
        const token = authorizationHeader.split(' ')[1]; // 提取 Token
        // 校验 Token
        const decodedToken = verifyToken(token);
        if (decodedToken && decodedToken.exp > Date.now() / 1000) {
            // Token 有效，且在有效期内
            // 执行相关操作

        } else {
            // Token 无效或已过期
            // 返回错误信息或采取适当的处理方式
        }
    } else {
        // 没有提供 Token，返回错误信息或采取适当的处理方式
    }
}

// 应用body-parser中间件
app.use(bodyParser.json())
// 配置cors
app.use(cors())
// 配置encode解析
app.use(express.urlencoded({ extended: false }))
// 激活路由
app.use(router)

// 防止node进程因异常而退出
process.on('uncaughtException', function (err) {
    console.log('异常错误信息: ' + err);
});
app.post('/img/upload', upload.single('file'), (req, res) => {
    const file = req.file;
    if (!file) {
        return res.status(400).send('Please upload a file');
    }
    let url = `${req.protocol}://${req.get('host')}/uploads/${file.filename}`
    // 文件上传成功，返回文件路径
    res.send({status: 200, imageUrl: `${req.protocol}://${req.get('host')}/uploads/${file.filename}` });
    let sql = 'update userinfo set photo = ? where userID = ?'
    db.query(sql, [url, req.body.userID])
});

// 设置路由映射，将访问/uploads路径下的文件映射到public/uploads目录
app.use('/uploads', express.static(path.join(__dirname, 'public', 'uploads')));


// 监听端口号为3000的服务器
app.listen(3000, function () {
    console.log("服务器已经启动了，运行在 http://127.0.0.1:3000");
})
